
/*
 * DiscPlanning.h
 *
 *  Created on: 12/09/2011
 *      Author: ${Petris-Normandia}
 */

#ifndef DISCPLANNING_H_
#define DISCPLANNING_H_

//librerias necesarias

#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <semaphore.h>
#include <time.h>
#include <signal.h>
#include <ctype.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include "epoll.h"
#include "log.h"
#include "sockLib.h"
#include "nipc.h"
#include "consola.h"
#include "socketsUnix.h"



//definicion de constantes
#define SECTORSIZE 512
#define PAGESIZE 4096
#define PATH_ARCHIVO "fat32.disk"
#define PATH_CONFIGURACION "archivodeconfiguracion.txt"
#define HEADS 1
#define LARGOPUERTO 10
#define MSXMIN 60000




//definicion de estructuras

typedef struct {
	int16_t cylinder;
	int16_t sector;
	uint8_t modo;
	void* content;
	int socket;
	uint32_t ped_log;
	uint64_t ID_pedido;

}tregCHS;

typedef struct {
	int16_t cylinder;
	int16_t sector;

}tregPosInicio;

typedef struct{
	char* modoInicio;
	struct in_addr IP;
	int16_t port;
	char* algoritmo;
	char*  pathSocketUnix;
	int16_t log;
	int8_t IDdisk;
	int16_t diskCylinders;
	int16_t diskSectors;
	tregPosInicio posinicial;
	int16_t readTime;
	int16_t writeTime;
	int16_t RPM;
	int16_t seekTime;
}Parametros;

struct nodo
   {
      tregCHS info;
      struct nodo *sigu;
  }typedef   nodo;

//definicion de variables globales

int  descriptorSocketUnix;
int16_t fileDescriptor;
void* punteroSector;
Parametros* parametros;
tregPosInicio* posactual;
nodo* listaPlanificada1;
nodo* listaPlanificada2;
nodo* pilaFscan;
void* princArchivo;
sem_t sem1;
sem_t sem2;
char flagRecorrido;
float sectorTime;
char* pathConsola;
int64_t Size_Disk;
int64_t Writed_Sectors;
pthread_t t_id1;
pthread_t t_id2;
pthread_t t_id3;

// Mauro
// Agrego mutex para listaPlanificada1 y 2
pthread_mutex_t mutex_lst1;
pthread_mutex_t mutex_lst2;


//encabezados de funciones

void atenderConsola();
void sigchld_handler(int);
void posicionarSector (tregCHS);
void initializeParameters();
void resolverPedidosFscan ();
void leeSocket(int);
int handshake(int);
void tratarmsj(T_MENSAJE*,tregCHS*);
void planificarPedidos();//corresponde al hilo 1
void resolverPedidos ();//corresponde al hilo 2
void atenderConsola();//corresponde al hilo 3
void openDisc (char*);
void readSector (T_MENSAJE**,uint64_t);
void writeSector (void*,T_MENSAJE**,uint64_t);
void closeDisc ();
void* traducirPedido(tregCHS*);
void cLook (tregCHS);
void fScan(nodo**);
void insertarNodo(nodo **,tregCHS);
void meterPila(nodo**,tregCHS);
void cargarlistaAscendente(nodo** ,nodo*);
void cargarlistaDescendente(nodo** ,nodo*);
int16_t leerConfig(char *,Parametros*);
int16_t cargarParametros(Parametros*, char *, char *);
float calcularRetraso(tregCHS);





#endif /* DISCPLANNING_H_ */
